

import bpy
import 全局控制.Node.节点和插座基类.bl_节点基类 as 基类
import 全局控制.Node.容器.bl_容器节点数据操作 as 节点数据操作

import engine.initLIB.load_dll as engineLib
import ctypes

import Core.bl_UI配色 as UI配色



engineLib.flexCAPI.f_创建取邻接元素节点.restype = ctypes.c_bool
engineLib.flexCAPI.f_创建取元素节点.restype = ctypes.c_bool











class C_Node_容器_取元素数量(基类.C_Node_基类):
	bl_dname = 'bl_node_取元素数量'
	bl_label = '取元素数量'

	def init(self, context):
		super(C_Node_容器_取元素数量, self).f_init(context)
		self.inputs.new('C_Socket_Vector模板', name='Vector')
		self.outputs.new('C_Socket_I32', name='数量')
		self.f_toCPP(self.id_data)

	def f_toCPP(self, tree):
		是否更新 = engineLib.flexCAPI.f_创建取元素数量节点(ctypes.c_wchar_p(tree.name), ctypes.c_wchar_p(self.name), self.f_getPyObject(tree));
		if 是否更新 :
			self.use_custom_color = True
			self.color = UI配色.g_容器操作类节点颜色


class C_NODE_AddMenu_取元素数量(bpy.types.Operator):
	bl_idname = 'node.global_node_get_element_num'
	bl_label = '取元素数量'
	bl_options = {'REGISTER', 'UNDO'}
	
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_容器_取元素数量', use_transform=True)
		return {'FINISHED'}













class C_Node_容器_取元素(基类.C_Node_基类):
	bl_dname = 'bl_node_容器_取元素'
	bl_label = '容器_取元素'

	def init(self, context):
		super(C_Node_容器_取元素, self).f_init(context)
		self.inputs.new('C_Socket_Vector模板', name='源')
		self.inputs.new('C_Socket_uVec4', name='index')
		self.outputs.new('C_Socket_引用', name='元素')
		self.f_toCPP(self.id_data)
		

	def f_toCPP(self, tree):
		是否更新 = engineLib.flexCAPI.f_创建取元素节点(ctypes.c_wchar_p(tree.name), ctypes.c_wchar_p(self.name), self.f_getPyObject(tree));
		if 是否更新 :
			self.inputs['index'].f_update()
			self.use_custom_color = True
			self.color = UI配色.g_容器操作类节点颜色


class C_NODE_AddMenu_容器_取元素(bpy.types.Operator):
	bl_idname = 'node.global_node_get_element'
	bl_label = '取元素'
	bl_options = {'REGISTER', 'UNDO'}
	
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_容器_取元素', use_transform=True)
		return {'FINISHED'}












E_坐标键值取邻接元素类型枚举 = [
	("TYPE_取邻接_网格包围", "网格包围", "", 0),
	("TYPE_取邻接_轴向", "轴向", "", 1),
	#("TYPE_取邻接_轴向", "*", "", 2),
]


def f_update_取邻接元素(self, context):
	data = list(str(self.m_运算类型))
	engineLib.flexCAPI.f_node_传入BL数据(ctypes.c_wchar_p(self.id_data.name), ctypes.c_wchar_p(self.name), ctypes.py_object(data));
	if context :
		self.id_data.f_节点数据更新_更新树([self])

def f_update_剔除空元素(self, context):
	data = list(str(self.m_运算类型))
	if self.m_剔除空元素 :
		data = list("TYPE_剔除空元素_true")
	else:
		data = list("TYPE_剔除空元素_false")
	
	engineLib.flexCAPI.f_node_传入BL数据(ctypes.c_wchar_p(self.id_data.name), ctypes.c_wchar_p(self.name), ctypes.py_object(data));
	if context :
		self.id_data.f_节点数据更新_更新树([self])

class C_Node_容器_取邻接元素(基类.C_Node_基类):
	bl_dname = 'bl_node_取邻接元素'
	bl_label = '取BVH邻接元素'
	
	m_运算类型 = bpy.props.EnumProperty(items=E_坐标键值取邻接元素类型枚举, name="运算", default="TYPE_取邻接_网格包围", update=f_update_取邻接元素)
	m_剔除空元素 = bpy.props.BoolProperty(name="剔除空元素", default=True, update=f_update_剔除空元素)
	def init(self, context):
		super(C_Node_容器_取邻接元素, self).f_init(context)
		self.inputs.new('C_Socket_Uint64Key_UInt32_Array2D', name='容器')
		self.inputs.new('C_Socket_iVec3_Array1D', name='键值')
		self.inputs.new('C_Socket_F32_Array1D', name='范围')
		
		self.outputs.new('C_Socket_顶点索引', name='索引')
		self.outputs.new('C_Socket_顶点索引', name='MASK')
		self.f_toCPP(self.id_data)

		

	def draw_buttons(self, context, layout):
		layout.prop(self, 'm_运算类型')
		layout.prop(self, 'm_剔除空元素')
		
	def f_toCPP(self, tree):
		是否更新 = engineLib.flexCAPI.f_创建取邻接元素节点(ctypes.c_wchar_p(tree.name), ctypes.c_wchar_p(self.name), self.f_getPyObject(tree));
		
		if 是否更新 :
			self.inputs['键值'].f_update()
			f_update_取邻接元素(self, None)
			f_update_剔除空元素(self, None)

			self.use_custom_color = True
			self.color = UI配色.g_容器操作类节点颜色


class C_NODE_AddMenu_取邻接元素(bpy.types.Operator):
	bl_idname = 'node.node_get_adjacency_element'
	bl_label = '取邻接元素'
	bl_options = {'REGISTER', 'UNDO'}
	
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_容器_取邻接元素', use_transform=True)
		return {'FINISHED'}










classes = (
	#C_Node_索引取列表中物体数据,
	#C_NODE_AddMenu_索引取列表中物体数据,

	C_Node_容器_取元素数量,
	C_NODE_AddMenu_取元素数量,

	C_Node_容器_取元素,
	C_NODE_AddMenu_容器_取元素,
	

	C_Node_容器_取邻接元素,
	C_NODE_AddMenu_取邻接元素,


)




def register():
	for c in classes:
		bpy.utils.register_class(c)
		

def unregister():
	for c in classes:
		bpy.utils.unregister_class(c)



